package com.ruoyi.hiscomm.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.ruoyi.hiscomm.domain.DeptDictDo;
import com.ruoyi.hiscomm.request.DeptParm;

import java.io.IOException;
import java.util.List;

/**
 * 科室字典服务接口
 * 定义科室数据的增删改查、搜索及 Elasticsearch 同步功能
 */
public interface IDeptDictService {

    /**
     * 更新科室字典数据（同步到数据库和 Elasticsearch）
     * @param deptDictDo 科室数据对象
     * @return 影响的数据库记录数
     * @throws IOException 数据同步异常
     */
    int updateDeptDict(DeptDictDo deptDictDo) throws IOException;

    /**
     * 添加科室字典数据（同步到数据库和 Elasticsearch）
     * @param dept 科室数据对象
     * @return 影响的数据库记录数
     * @throws IOException 数据同步异常
     */
    int addDeptDict(DeptDictDo dept) throws IOException;

    /**
     * 精准查询科室（基于 deptName 和 inputCode 字段）
     * @param dept 包含查询条件的科室对象（需设置 deptName）
     * @return 匹配的科室列表
     * @throws IOException 搜索异常
     */
    List<DeptDictDo> searchDeptDict(DeptDictDo dept) throws IOException;

    /**
     * 模糊查询科室（基于 deptName 和 deptAlias 字段）
     * @param dept 包含查询条件的科室对象（需设置 deptName，且长度≥2）
     * @return 模糊匹配的科室列表
     * @throws IOException 搜索异常
     */
    List<DeptDictDo> searchDeptsWithFuzzy(DeptDictDo dept) throws IOException;

    /**
     * 检查科室名称是否唯一（同时检查数据库和 Elasticsearch）
     * @param dept 待检查的科室对象（需设置 deptName）
     * @return true-名称已存在，false-名称可用
     * @throws IOException 检查异常
     */
    boolean checkDeptNameUnique(DeptDictDo dept) throws IOException;

    /**
     * 查询所有科室数据（从数据库）
     * @return 科室列表
     */
    List<DeptDictDo> listDepts();

    /**
     * 分页模糊查询科室（基于 Elasticsearch）
     * @param dept 分页查询参数（需设置 deptName、currentPage、pageSize）
     * @return 分页结果（包含当前页数据）
     */
    IPage<DeptDictDo> pageESDeptList(DeptParm dept);

    /**
     * 列表模糊查询科室（基于 Elasticsearch）
     * @param dept 模糊查询参数（需设置 deptName，且长度≥2）
     * @return 模糊匹配的科室列表
     * @throws IOException 搜索异常
     */
    List<DeptDictDo> listFuzzyDepts(DeptParm dept) throws IOException;

    /**
     * 分页精准查询科室(基于Redis)
     * @param dept
     * @return 分页查询参数（需设置 deptName、currentPage、pageSize）
     */
    IPage<DeptDictDo> pageRedisDeptList(DeptParm dept);

    /**
     * 删除科室(基本上不允许)，可能需要大量校验方能删除，当前设想，
     * 需要增加一张表，该表用于记录所有字典关键字是否有在业务过程中使用过的记录
     * @param id 由于表中无id，当前的id 组成 hospital_id||dept_code
     * @return
     * @throws IOException
     */
    boolean deleteDeptDict(String id) throws IOException;
}